//
//  WebNetworkTools.swift
//  WeiBoApp
//
//  Created by CrazyHacker on 16/7/2.
//  Copyright © 2016年 CrazyHacker. All rights reserved.
//

import UIKit
import AFNetworking

enum requestMethod {
    case GET
    case POST
}
class WebNetworkTools: AFHTTPSessionManager {
    
    /// 静态区／常量／闭包
    /// 在第一次访问时，执行闭包，并且将结果保存在 shared 常量中
    static let shared = {()->WebNetworkTools in
        // 实例化单例
        let instance = WebNetworkTools()
        // 设置相应反序列化支持的类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        return instance
    }()
    lazy var userAccount = WBUserAccount()

    /// 标记是否有访问令牌 -- 计算型属性(不占用存储空间, Extensions中不可以定义属性, 但是可以定义计算型属性)
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
   
    /// 专门负责拼接 token 的网络请求方法
    func tokenRequest(method: requestMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion: (json: AnyObject?, isSuccess: Bool)->()) {
        
        // 处理 token 字典
        // 0> 判断 token 是否为 nil，为 nil 直接返回 程序执行过程中,一般不会为nil
        guard let token = userAccount.access_token else {
            //print("没有 token! 需要登录")
            NotificationCenter.default().post(name: NSNotification.Name(rawValue: WBUserShouldLogonNotification), object: nil)
            completion(json: nil, isSuccess: false)
            
            return
        }
        
        // 1> 判断 参数字典是否存在，如果为 nil，应该新建一个字典
        var parameters = parameters
        if parameters == nil {
            // 实例化字典
            parameters = [String: AnyObject]()
        }
        
        // 2> 设置参数字典，代码在此处字典一定有值
        parameters!["access_token"] = token
        
        // 调用 request 发起真正的网络请求方法
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
    
    /// 封装 AFN 的 GET / POST 请求
    ///
    /// - parameter method:     GET / POST
    /// - parameter URLString:  URLString
    /// - parameter parameters: 参数字典
    /// - parameter completion: 完成回调[json(字典／数组), 是否成功]
   func request(method: requestMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion: (json: AnyObject?, isSuccess: Bool)->()) {
        
        // 成功回调
        let success = { (task: URLSessionDataTask, json: AnyObject?)->() in
            
            completion(json: json, isSuccess: true)
        }
        
        // 失败对调
        let failure = { (task: URLSessionDataTask?, error: NSError)->() in
            // error 通常比较吓人，例如编号：XXXX，错误原因一堆英文！
            print("网络请求错误 \(error)")
            if (task?.response as? HTTPURLResponse)?.statusCode == 403  {
                print("过期了")
                NotificationCenter.default().post(name: NSNotification.Name(rawValue: WBUserShouldLogonNotification), object: "bad token")
            
            }
            completion(json: nil, isSuccess: false)
        }
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
            
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
}


